package uy.org.softtech.cssuite.repositorios;

import java.util.Set;

import uy.org.softtech.cssuite.entidad.finanzas.Cuenta;
import uy.org.softtech.cssuite.excepciones.EntidadNoActualizadaException;
import uy.org.softtech.cssuite.excepciones.EntidadNoCreadaException;
import uy.org.softtech.cssuite.excepciones.EntidadNoEncontradaException;

/**
 * Interfaz por medio de la cual se acceden a los datos de las cuentas de los clientes en la base de datos.
 * 
 * @author fabian.lobo
 */
public interface RepositorioCuentas {
	
	/**
	 * Retorna el registro de la cuenta de cliente asociada al identificador dado
	 * 
	 * @param id - Identificador de la cuenta de cliente
	 * @throws EntidadNoEncontradaException si no se encuentra una cuenta con ese ID
	 * @author fabian.lobo
	 */
	Cuenta buscar(Long id) throws EntidadNoEncontradaException;

	/**
	 * Almacena los datos de la nueva cuenta de cliente en la base de datos
	 * 
	 * @param cuenta - Cuenta con los datos a almacenar
	 * @param servicio - Nombre del servicio en donde se almacenan los datos
	 * @return la cuenta almacenada
	 * @throws EntidadNoCreadaException si no se pueden almacenar los datos en la base de datos
	 * @author fabian.lobo
	 */
	Cuenta crear(Cuenta cuenta, String servicio) throws EntidadNoCreadaException;

	/**
	 * Actualiza los datos de la cuenta de cliente en la base de datos
	 * 
	 * @param cuenta - Cuenta con los datos a actualizar
	 * @param servicio - Nombre del servicio en donde se actualizan los datos
	 * @return la cuenta actualizada
	 * @throws EntidadNoActualizadaException si no se pueden actualizar los datos en la base de datos
	 * @author fabian.lobo
	 */
	Cuenta actualizar(Cuenta cuenta, String servicio) throws EntidadNoActualizadaException;

	/**
	 * Retorna una lista de las cuentas pertenecientes al cliente relacionado con el identificador dado
	 * 
	 * @param cliente - Identificador del cliente
	 * @author fabian.lobo
	 */
	Set<Cuenta> obtenerCuentas(Long cliente);

}
